package cs2114.antiFingerMines;

import java.util.Observable;

/**
 * // -------------------------------------------------------------------------
 * /** This is are interface with the features (methods) that must be
 * implemented by the AntiFingerMine model.
 *
 * @author Blake Whaley
 * @author Graham McLaughlin (gjm1324)
 * @author William Vuong (wnvuong)
 * @version 2012.29.4
 */
public abstract class AntiFingerMineAbstract
    extends Observable
{
    protected Mine[]   field;
    protected float    viewWidth;
    protected float    viewHeight;
    protected Location finger;
    protected int      numMines;
    protected boolean  loseStatus;
    protected boolean  winStatus;

    // This is the y-location where the mines can begin being place anything
    // less than this number is "safe"
    protected float    startOfField;
    protected float    endOfField;

    protected float    spaceForMine;


    /**
     * Create a new AntiFingerMineAbstract object.
     */
    public AntiFingerMineAbstract()
    {
    }

    public abstract Location getFingerLocation();

    public abstract void setFingerLocation(float x, float y);


    /**
     * This is the method that places all of the mines in our data structure and
     * resets any other variables in order to begin a new game.
     */
    public abstract void newGame(float w, float h, int mines);


    /**
     * I meant to make this private but it cannot be in an interface. This
     * method should only be called in the constructor to establish the width of
     * the view.
     *
     * @param w
     *            the view's width
     */
    public abstract void setWidth(float w);


    /**
     * same as width but height.
     *
     * @param h
     *            the view's height.
     */
    public abstract void setHeight(float h);


    /**
     * This is our key algorithm that will be responsible for placing all of the
     * mines and setting their radiuses. It will most likely be called in
     * newGame().
     */
    public abstract void setRandomMines();


    public Mine[] getField()
    {
        return field;
    }

}
